package threads;


import java.awt.*;
import java.awt.event.*;


class MainDisplayOne {
    int i = 0;
    boolean flag = true;

    synchronized void displayAdd() {
        while (true) {
            if (flag) {
                try {
                    wait();//Cho luồng hiện tại wait cho đến khi có notify() ở luồng đánh thức
                } catch (Exception e) {
                }
            }
            System.out.println(i++);
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
            notify();//Đánh thức luồng khác từ wait chuyển sang chạy tiếp
        }

    }

    synchronized void displaySub() {
        while (true) {
            if (!flag) {
                try {
                    wait();//Cho luồng hiện tại wait cho đến khi có notify() ở luồng đánh thức
                } catch (Exception e) {
                }
            }
            System.out.println(i--);
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
            notify();//Đánh thức luồng khác từ wait chuyển sang chạy tiếp
        }

    }
}

class ShowMeOne implements Runnable {

    MainDisplayOne md;
    Thread t;

    ShowMeOne(MainDisplayOne md) {
        this.md = md;
        t = new Thread(this);
        t.start();
    }

    public void run() {
        System.out.print("Thread showMe :");
        md.displayAdd();
    }
}

class ShowMeTooOne implements Runnable {

    MainDisplayOne md;
    Thread t;

    ShowMeTooOne(MainDisplayOne md) {
        this.md = md;
        t = new Thread(this);
        t.start();
    }

    public void run() {

        System.out.print("Thread showMeToo :");
        md.displaySub();
    }
}
class DemoWait {
    public static void main(String arg[]) {
        MainDisplayOne md = new MainDisplayOne();
        new ShowMeOne(md);
        new ShowMeTooOne(md);
        new YouGetUpOne(md);
    }
}

class YouGetUpOne extends Frame implements ActionListener {

    Button btn = new Button("Ok");
    MainDisplayOne md;

    public YouGetUpOne(MainDisplayOne md) {
        add(btn);
        this.md = md;
        btn.addActionListener(this);
        setSize(100, 100);
        setVisible(true);


    }

    public void actionPerformed(ActionEvent ae) {
        md.flag = (!(md.flag));
    }
}
/*
 * */